﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using QldtSdh.BLL;
using QldtSdh.DAL.Models;
using QldtSdh.GUI.Common;
using QldtSdh.GUI.Utils;

namespace QldtSdh.GUI.XetTotNghiep
{
    public partial class UcThongKeKetQuaHocTap : QldtSdh.GUI.Common.BaseUserControl
    {
        bool allowUpdate = false;
        FormInBangDiem formInBangDiem = null;
        private QldtSdh.DAL.Models.CEMS4UG_DHKHContext m_DbContext = null;
        private QldtSdh.DAL.Models.CEMS4UG_DHKHContext DbContext
        {
            get
            {
                if (m_DbContext == null)
                    m_DbContext = QldtSdh.DAL.Models.CEMS4UG_DHKHContext.GetContext();
                return m_DbContext;
            }
        }
        public UcThongKeKetQuaHocTap()
        {
            InitializeComponent();
            gridHocVien.AddRowIndexing();
            InitGridHocVien();

            LoadKhoaHoc();
        }

        void InitGridHocVien()
        {
            gridHocVien.AutoGenerateColumns = false;
            colMaHocVien.DataPropertyName = "MaHocVien";
            colHoDem.DataPropertyName = "HoDem";
            colTen.DataPropertyName = "Ten";
            colGioiTinh.DataPropertyName = "_GioiTinhStr";
            colNgaySinh.DataPropertyName = "NgaySinh";
            colChungChi.DataPropertyName = "_CoChungChi";
            colDiemTrungBinhChungTichLuy.DataPropertyName = "_DiemTichLuy";
            colTongSoTinChiTichLuy.DataPropertyName = "_TinChiTichLuy";
            colDiemLuanVan.DataPropertyName = "_DiemLuanVan";
            colSelected.DataPropertyName = "_IsSelected";
        }

        void LoadKhoaHoc()
        {
            allowUpdate = false;
            cbxKhoaHoc.DataSource = BizKhoaHoc.GetList(DbContext);
            cbxKhoaHoc.DisplayMember = "TenKhoaHoc";
            cbxKhoaHoc.ValueMember = "MaKhoaHocGUID";
            allowUpdate = true;
            LoadLop();
        }

        void LoadLop()
        {
            allowUpdate = false;
            var khoahoc = cbxKhoaHoc.SelectedItem as KhoaHoc;
            if (khoahoc != null)
            {
                cbxLop.DataSource = BizLopKhoaNganh.GetList(khoahoc.MaKhoaHocGUID, DbContext);
                cbxLop.DisplayMember = "TenLopKhoaNganh";
                cbxLop.ValueMember = "MaLopKhoaNganhGUID";
            }
            else
            {
                cbxLop.Items.Clear();
            }
            allowUpdate = true;
            LoadHocVien();
        }

        void LoadHocVien()
        {
            allowUpdate = false;
            var lop = cbxLop.SelectedItem as LopKhoaNganh;
            if (lop != null)
            {
                var ls = BizHocVien.GetListToFinal(lop.MaLopKhoaNganhGUID);
                bdHocVien.DataSource = ls;
                gridHocVien.DataSource = bdHocVien;
            }
            else
            {
                bdHocVien.DataSource = null;
                gridHocVien.DataSource = bdHocVien;
            }
            allowUpdate = true;
            LoadCTDT();
        }

        void LoadCTDT()
        {
            allowUpdate = false;
            bool duDK = true;
            var hocVien = bdHocVien.Current as HocVien;
            var lop = cbxLop.SelectedItem as LopKhoaNganh;
            treeCTDT.Nodes.Clear();
            string message = "";
            var lsNodes = GenTreeNodes(hocVien, lop, out duDK, out message);
            foreach (var node in lsNodes)
                treeCTDT.Nodes.Add(node);
            treeCTDT.ExpandAll();
            btnChonTatCa.Enabled = btnInBangDiemSelected.Enabled = btnPreview.Enabled = btnPrinter.Enabled = true;
            if (duDK)
            {
                lbDieuKien.Text = "Đủ điều kiện tốt nghiệp";
            }
            else
            {
                lbDieuKien.Text = message;
            }
            allowUpdate = true;
        }

        private List<TreeNode> GenTreeNodes(HocVien hocVien, LopKhoaNganh lop, out bool duDieuKien, out string _message)
        {
            TreeNode nodeKTC = new TreeNode("Kiến thức chung", 4, 4);
            TreeNode nodeKTC_BB = new TreeNode("Học phần bắt buộc", 4, 4);
            TreeNode nodeKTC_TC = new TreeNode("Học phần tự chọn", 4, 4);
            nodeKTC.Nodes.Add(nodeKTC_BB);
            nodeKTC.Nodes.Add(nodeKTC_TC);
            TreeNode nodeKTCS = new TreeNode("Kiến thức cơ sở", 4, 4);
            TreeNode nodeKTCS_BB = new TreeNode("Học phần bắt buộc", 4, 4);
            TreeNode nodeKTCS_TC = new TreeNode("Học phần tự chọn", 4, 4);
            nodeKTCS.Nodes.Add(nodeKTCS_BB);
            nodeKTCS.Nodes.Add(nodeKTCS_TC);
            TreeNode nodeKTCN = new TreeNode("Kiến thức chuyên ngành", 4, 4);
            TreeNode nodeKTCN_BB = new TreeNode("Học phần bắt buộc", 4, 4);
            TreeNode nodeKTCN_TC = new TreeNode("Học phần tự chọn", 4, 4);
            nodeKTCN.Nodes.Add(nodeKTCN_BB);
            nodeKTCN.Nodes.Add(nodeKTCN_TC);
            int tcKienThucChung = 0, tcKienThucCoSo = 0, tcKienThucChuyenNganh = 0;
            bool duDK = true;
            string message = "";
            List<ChuongTrinhDaoTao_HocPhan> ls = null;
            if (hocVien != null && lop != null)
            {
                var khoa_nganh = BizKhoaHoc_NganhDaoTao.GetByID(lop.MaDaoTaoKhoaNganhGUID);
                if (khoa_nganh != null)
                {
                    var ctdt = BizChuongTrinhDaoTao.GetByID(khoa_nganh.MaChuongTrinhDaoTaoGUID);
                    ls = BizChuongTrinhDaoTao_HocPhan.GetList(khoa_nganh.MaChuongTrinhDaoTaoGUID);
                    if (ls != null && ls.Count > 0 && ctdt != null)
                    {
                        var kqht = BizHocVien_KetQuaHocTap.GetList(hocVien.MaHocVien);
                        #region Kiểm tra kết quả học tập
                        foreach (var item in ls)
                        {
                            var kq = kqht.Find(e => e.MaHocPhanGUID == item.MaHocPhan);
                            int imageKey = 4;
                            if (kq != null)
                            {
                                item.Diem = (double)kq.DiemHe10;
                                //Đã học nhưng không qua
                                if (item.Diem < 5)
                                {
                                    duDK = false;
                                    imageKey = 5;
                                }
                            }
                            else if (item.LaHocPhanBatBuoc)
                            {
                                //Chưa học học phần bắt buộc
                                duDK = false;
                                imageKey = 5;
                            }
                            if (item.KhoiKienThuc == (int)KHOIKIENTHUC.KIENTHUCCHUNG)
                            {
                                if (item.LaHocPhanBatBuoc)
                                {
                                    if (nodeKTC_BB.ImageIndex != 5)
                                        nodeKTC_BB.ImageIndex = nodeKTC_BB.SelectedImageIndex = imageKey;
                                    nodeKTC_BB.Nodes.Add(item.MaHocPhan, string.Format("{0}-{1}: {2}TC. Điểm: {3}", item.MaHocPhan_Real, item.TenHocPhan, item.SoTinChi, item.Diem), imageKey, imageKey);
                                }
                                else
                                {
                                    tcKienThucChung += kq != null ? item.SoTinChi : 0;
                                    if (nodeKTC_TC.ImageIndex != 5)
                                        nodeKTC_TC.ImageIndex = nodeKTC_TC.SelectedImageIndex = imageKey;
                                    nodeKTC_TC.Nodes.Add(item.MaHocPhan, string.Format("{0}-{1}: {2}TC. Điểm: {3}", item.MaHocPhan_Real, item.TenHocPhan, item.SoTinChi, item.Diem), imageKey, imageKey);
                                }
                                if (nodeKTC.ImageIndex != 5)
                                    nodeKTC.ImageIndex = nodeKTC.SelectedImageIndex = imageKey;
                            }
                            if (item.KhoiKienThuc == (int)KHOIKIENTHUC.KIENTHUCCOSO)
                            {
                                if (item.LaHocPhanBatBuoc)
                                {
                                    if (nodeKTCS_BB.ImageIndex != 5)
                                        nodeKTCS_BB.ImageIndex = nodeKTCS_BB.SelectedImageIndex = imageKey;
                                    nodeKTCS_BB.Nodes.Add(item.MaHocPhan, string.Format("{0}-{1}: {2}TC. Điểm: {3}", item.MaHocPhan_Real, item.TenHocPhan, item.SoTinChi, item.Diem), imageKey, imageKey);
                                }
                                else
                                {
                                    tcKienThucCoSo += kq != null ? item.SoTinChi : 0;
                                    if (nodeKTCS_TC.ImageIndex != 5)
                                        nodeKTCS_TC.ImageIndex = nodeKTCS_TC.SelectedImageIndex = imageKey;
                                    nodeKTCS_TC.Nodes.Add(item.MaHocPhan, string.Format("{0}-{1}: {2}TC. Điểm: {3}", item.MaHocPhan_Real, item.TenHocPhan, item.SoTinChi, item.Diem), imageKey, imageKey);
                                }
                                if (nodeKTCS.ImageIndex != 5)
                                    nodeKTCS.ImageIndex = nodeKTCS.SelectedImageIndex = imageKey;
                            }
                            if (item.KhoiKienThuc == (int)KHOIKIENTHUC.KIENTHUCCHUYENNGANH)
                            {
                                if (item.LaHocPhanBatBuoc)
                                {
                                    if (nodeKTCN_BB.ImageIndex != 5)
                                        nodeKTCN_BB.ImageIndex = nodeKTCN_BB.SelectedImageIndex = imageKey;
                                    nodeKTCN_BB.Nodes.Add(item.MaHocPhan, string.Format("{0}-{1}: {2}TC. Điểm: {3}", item.MaHocPhan_Real, item.TenHocPhan, item.SoTinChi, item.Diem), imageKey, imageKey);
                                }
                                else
                                {
                                    tcKienThucChuyenNganh += kq != null ? item.SoTinChi : 0;
                                    if (nodeKTCN_TC.ImageIndex != 5)
                                        nodeKTCN_TC.ImageIndex = nodeKTCN_TC.SelectedImageIndex = imageKey;
                                    nodeKTCN_TC.Nodes.Add(item.MaHocPhan, string.Format("{0}-{1}: {2}TC. Điểm: {3}", item.MaHocPhan_Real, item.TenHocPhan, item.SoTinChi, item.Diem), imageKey, imageKey);
                                }
                                if (nodeKTCN.ImageIndex != 5)
                                    nodeKTCN.ImageIndex = nodeKTCN.SelectedImageIndex = imageKey;
                            }
                            if (duDK)
                            {
                                message = "Đủ điểm";
                                lblICONDiem.ImageIndex = 4;
                            }
                            else
                            {
                                message = "Chưa đủ điểm";
                                lblICONDiem.ImageIndex = 5;
                            }
                        }
                        #endregion

                        #region Kiểm tra số tín chỉ tự chọn
                        //Chưa đủ số tín chỉ tự chọn trong các phần kiến thức
                        if (!(ctdt.SoTinChiTuChonPhaiChonTrongPhanChung == tcKienThucChung &&
                            ctdt.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh == tcKienThucChuyenNganh &&
                            ctdt.SoTinChiTuChonPhaiChonTrongPhanCoSo == tcKienThucCoSo))
                        {
                            duDK = false;
                            message += "\r\nChưa học đủ số tín chỉ tự chọn trong các phần kiến thức";
                            lblICONTINCHITUCHON.ImageIndex = 2;
                            if (ctdt.SoTinChiTuChonPhaiChonTrongPhanChung != tcKienThucChung)
                            {
                                nodeKTC_TC.ImageIndex = nodeKTC_TC.SelectedImageIndex = 2;
                                nodeKTC.ImageIndex = nodeKTC.SelectedImageIndex = 5;
                            }
                            if (ctdt.SoTinChiTuChonPhaiChonTrongPhanChuyenNganh != tcKienThucChuyenNganh)
                            {
                                nodeKTCN_TC.ImageIndex = nodeKTCN_TC.SelectedImageIndex = 2;
                                nodeKTCN.ImageIndex = nodeKTCN.SelectedImageIndex = 5;
                            }
                            if (ctdt.SoTinChiTuChonPhaiChonTrongPhanCoSo != tcKienThucCoSo)
                            {
                                nodeKTCS_TC.ImageIndex = nodeKTCS_TC.SelectedImageIndex = 2;
                                nodeKTCS.ImageIndex = nodeKTCS.SelectedImageIndex = 5;
                            }
                        }
                        else
                        {
                            message += "\r\nĐủ số tín chỉ tự chọn trong các phần kiến thức";
                            lblICONTINCHITUCHON.ImageIndex = 4;
                        }
                        #endregion

                        #region Kiểm tra thông tin luận văn
                        //Kiểm tra điều kiện luận văn
                        decimal dlv = (decimal)5.5;
                        if (!(hocVien.DiemLuanVan.HasValue && hocVien.DiemLuanVan.Value >= dlv))
                        {
                            duDK = false;
                            message += "\r\nChưa có điểm luận văn hoặc luận văn không đủ điểm";
                            lblICONLUANVAN.ImageIndex = 5;
                        }
                        else
                        {
                            message += "\r\nĐủ điểm luận văn";
                            lblICONLUANVAN.ImageIndex = 4;
                        }
                        #endregion

                        #region Kiểm tra chứng chỉ
                        //Kiểm tra điều kiện chứng chỉ
                        if (!(hocVien._CoChungChi))
                        {
                            duDK = false;
                            message += "\r\nChưa có chứng chỉ ngoại ngữ";
                            lblICONChungChi.ImageIndex = 5;
                        }
                        else
                        {
                            message += "\r\nĐã có chứng chỉ ngoại ngữ";
                            lblICONChungChi.ImageIndex = 4;
                        }
                        #endregion
                    }
                    else
                        duDK = false;
                }
                else
                    duDK = false;
            }
            else
                duDK = false;
            duDieuKien = duDK;
            _message = message;
            List<TreeNode> lsNodes = new List<TreeNode>();
            lsNodes.Add(nodeKTC);
            lsNodes.Add(nodeKTCS);
            lsNodes.Add(nodeKTCN);
            bdCTDT.DataSource = ls;
            return lsNodes;
        }

        private void cbxKhoaHoc_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
                LoadLop();
        }

        private void cbxLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
                LoadHocVien();
        }

        private void bdHocVien_CurrentChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
            {
                LoadCTDT();
            }
        }

        private void btnPrinter_Click(object sender, EventArgs e)
        {
            var hocVien = bdHocVien.Current as HocVien;
            var ctdt = bdCTDT.DataSource as List<ChuongTrinhDaoTao_HocPhan>;
            var lop = cbxLop.SelectedItem as LopKhoaNganh;
            var khoaHoc = cbxKhoaHoc.SelectedItem as KhoaHoc;
            if (hocVien != null && ctdt != null && ctdt.Count > 0 && lop != null && khoaHoc != null && lop != null)
            {
                var daoTaoKhoaNganh = BizKhoaHoc_NganhDaoTao.GetByID(lop.MaDaoTaoKhoaNganhGUID);
                if (daoTaoKhoaNganh != null)
                {
                    var nganh = BizChuyenNganhDaoTao.GetByID(daoTaoKhoaNganh.MaNganhDaoTaoGUID);
                    if (nganh != null)
                    {
                        if (formInBangDiem == null)
                            formInBangDiem = new FormInBangDiem();
                        formInBangDiem.ShowOrPrint(hocVien, ctdt, nganh, khoaHoc.NamTuyenSinh, false);
                    }
                }
            }
        }

        private void btnPreview_Click(object sender, EventArgs e)
        {
            var hocVien = bdHocVien.Current as HocVien;
            var ctdt = bdCTDT.DataSource as List<ChuongTrinhDaoTao_HocPhan>;
            var lop = cbxLop.SelectedItem as LopKhoaNganh;
            var khoaHoc = cbxKhoaHoc.SelectedItem as KhoaHoc;
            if (hocVien != null && ctdt != null && ctdt.Count > 0 && lop != null && khoaHoc != null && lop != null)
            {
                var daoTaoKhoaNganh = BizKhoaHoc_NganhDaoTao.GetByID(lop.MaDaoTaoKhoaNganhGUID);
                if (daoTaoKhoaNganh != null)
                {
                    var nganh = BizChuyenNganhDaoTao.GetByID(daoTaoKhoaNganh.MaNganhDaoTaoGUID);
                    if (nganh != null)
                    {
                        if (formInBangDiem == null)
                            formInBangDiem = new FormInBangDiem();
                        formInBangDiem.ShowOrPrint(hocVien, ctdt, nganh, khoaHoc.NamTuyenSinh, true);
                    }
                }
            }
            else
            {
                DialogUtils.ShowError("Không thể xem bảng điểm của học viên.");
            }
        }

        private void btnInBangDiemSelected_Click(object sender, EventArgs e)
        {
            var ls = bdHocVien.DataSource as List<HocVien>;
            if (ls != null && ls.Count > 0)
            {
                int i = 0;
                //int total = ls.Count(t => t._IsSelected == true);
                foreach (var hocVien in ls)
                {
                    i++;
                    if (hocVien._IsSelected)
                    {
                        bool duKD = false;
                        var lop = cbxLop.SelectedItem as LopKhoaNganh;
                        var ctdt = BizChuongTrinhDaoTao.LoadCTDT(hocVien, lop, out duKD);
                        var khoaHoc = cbxKhoaHoc.SelectedItem as KhoaHoc;
                        if (hocVien != null && ctdt != null && ctdt.Count > 0 && lop != null && khoaHoc != null && lop != null)
                        {
                            var daoTaoKhoaNganh = BizKhoaHoc_NganhDaoTao.GetByID(lop.MaDaoTaoKhoaNganhGUID);
                            if (daoTaoKhoaNganh != null)
                            {
                                var nganh = BizChuyenNganhDaoTao.GetByID(daoTaoKhoaNganh.MaNganhDaoTaoGUID);
                                if (nganh != null)
                                {
                                    if (formInBangDiem == null)
                                        formInBangDiem = new FormInBangDiem();
                                    formInBangDiem.ShowOrPrint(hocVien, ctdt, nganh, khoaHoc.NamTuyenSinh, false);

                                    Thread.Sleep(2000);
                                }
                            }
                        }
                    }
                }
            }
        }

        bool selected = true;

        private void btnChonTatCa_Click(object sender, EventArgs e)
        {
            var ls = bdHocVien.DataSource as List<HocVien>;
            if (ls != null && ls.Count > 0)
            {
                foreach (var hocVien in ls)
                    hocVien._IsSelected = selected;
                selected = !selected;
                gridHocVien.Refresh();
            }
        }

        private void btnNapThongTinLuanVan_Click(object sender, EventArgs e)
        {
            var f = new FormQuanlyHocVien_ImportLuanVan();
            if (f.ShowDialog() == DialogResult.OK)
                LoadHocVien();
        }

        private void btnTaoDanhSachDeNghiXetTotNghiep_Click(object sender, EventArgs t)
        {
            int soHocVienDuocXet = 0;
            int soHocVien = 0;
            var khoaHoc = cbxKhoaHoc.SelectedItem as KhoaHoc;
            if (khoaHoc != null)
            {
                var dsLop = this.DbContext.LopKhoaNganhDbSet.Where(e => e.KhoaHoc_NganhDaoTao.MaKhoaHocGUID == khoaHoc.MaKhoaHocGUID).OrderBy(e => e.TenLopKhoaNganh).ToList();
                if (dsLop != null && dsLop.Count > 0)
                {
                    foreach (var lop in dsLop)
                    {
                        //var dsHocVienTheoLop = this.DbContext.HocVienDbSet.Where(e => e.MaLopKhoaNganhGUID == lop.MaLopKhoaNganhGUID).OrderBy(e => e.Ten).ThenBy(e => e.HoDem).ToList();
                        var dsHocVienTheoLop = BizHocVien.GetList(lop.MaLopKhoaNganhGUID);
                        if (dsHocVienTheoLop != null && dsHocVienTheoLop.Count > 0)
                        {
                            foreach (var hocVien in dsHocVienTheoLop)
                            {
                                soHocVien++;
                                bool duDK = false;
                                BizChuongTrinhDaoTao.LoadCTDT(hocVien, lop, out duDK);
                                if (duDK)
                                {
                                    NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                                    BizNhatKyHoatDong.InitData<HocVien>(nhatKy, hocVien, hocVien.MaHocVien, LOAIDOITUONG.HỌC_VIÊN, LOAITHAOTAC.Chỉnh_sửa);
                                    hocVien.DaTotNghiep = true;
                                    DbContext.SaveChanges();
                                    BizNhatKyHoatDong.Add<HocVien>(nhatKy, hocVien);
                                    soHocVienDuocXet++;
                                }
                            }
                        }
                    }
                }
                DialogUtils.ShowMessage("Có " + soHocVienDuocXet + "/" + soHocVien + " học viên, trong " + dsLop.Count + " lớp, thuộc khóa học " + khoaHoc.TenKhoaHoc + " được xét tốt nghiệp thành công");
            }

        }

        private void UcThongKeKetQuaHocTap_ControlRemoved(object sender, ControlEventArgs e)
        {
            if (m_DbContext != null)
                m_DbContext.Dispose();
        }

        private void lnkShow_Click(object sender, EventArgs e)
        {
            pnlFilterContainter.Visible = !pnlFilterContainter.Visible;
        }

        private void lblICONLUANVAN_Click(object sender, EventArgs e)
        {

        }
    }
}
